package com.knowledge.plus.泛型.通配符;

import org.junit.Test;

import java.util.ArrayList;

/**
 * 下界通配符 <? super T>，类型参数的范围是 T 和 T 的超类
 * 可以写，不能读。因为任何 T 的父类型都可以接受一个 T 类型的值
 *
 * @author TPF
 * @since 2023/7/27
 */
public class 下界通配符 {

    /**
     * <? super T> 也是一个数据类型实参，它和 Number、String、Integer 一样都是一种实际的数据类型。
     */
    public void genericTypeUsage() {
        // 编译错误
        // ArrayList<Integer> list01 = new ArrayList<Number>();
        // 编译正确
        ArrayList<? super Integer> list02 = new ArrayList<Number>();
    }

    /**
     *  ArrayList<? super Number> 的下界是 ArrayList< Number >
     *  因此，我们可以确定 Number 类及其子类的对象自然可以加入 ArrayList<? super Number> 集合中
     *  而 Number 类的父类对象就不能加入 ArrayList<? super Number> 集合中了，因为不能确定 ArrayList<? super Number> 集合的数据类型
     */
    @Test
    public void genericTypeTest() {
        // 创建一个 ArrayList<? super Number> 集合
        ArrayList<Number> list = new ArrayList();
        // 往集合中添加 Number 类及其子类对象
        list.add(new Integer(1));
        list.add(new Float(1.1));
        // 调用 fillNumList() 方法，传入 ArrayList<Number> 集合
        fillNumList(list);
        System.out.println(list);
    }

    public static void fillNumList(ArrayList<? super Number> list) {
        list.add(new Integer(0));
        list.add(new Float(1.0));
    }

}
